package basics.designpattern.singleton;


/**
 * @author or2
 * @Description 双重检测实现 单例模式
 * @create 2021年09月01日 时间: 15:33
 */
public class LazyCheck {
    private static volatile LazyCheck lazyCheckSingleton;

    private LazyCheck() {
    }

    public static LazyCheck getLazyCheckSingleton() {
        if (lazyCheckSingleton == null) {
//            防止同时进入判断后可能出现两次实例化并返回的情况 - 也尽可能减少锁的粒度
            synchronized (LazyCheck.class) {
                if (lazyCheckSingleton == null) {
//                    初始化过程不是原子的!!!(指令重排序) -> 使用volatile关键字修饰
                    /* 会出现引用未初始化完全的内存空间 (先初始化? or 先指向分配好的内存空间?) */
                    lazyCheckSingleton = new LazyCheck();
                }
            }
        }
        return lazyCheckSingleton;
    }

}
